﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Collections.Generic;
using System.Threading;
using WP7Client.Helpers;
using WP7Client.ServerManager;
using MSH.Common.DAO.Results;

namespace WP7Client.Managers
{
    /// <summary>
    /// De SendMessageManager zorgt ervoor dat berichten die opgestuurd moeten worden, pas worden verwijderd als alles ook echt is aangekomen op de server
    /// </summary>
    public static class SendMessageManager
    {
        private static Queue<MessageToSend> MessageQueue = null;
        private static Thread sendThread = null;

        /// <summary>
        /// Start de SendMessageManager
        /// </summary>
        public static void Start()
        {
            if (sendThread != null && sendThread.IsAlive)
                sendThread.Abort();
            Init();
        }

        /// <summary>
        /// Stop de SendMessageManager
        /// </summary>
        public static void Stop()
        {
            sendThread = null;
        }

        private static void Init()
        {
            MessageQueue = new Queue<MessageToSend>();
            sendThread = new Thread(Run);
            sendThread.Start();
        }

        /// <summary>
        /// Voeg een nieuwe chat bericht toe aan de queue
        /// </summary>
        /// <param name="username">Gebruikersnaam van waar het bericht heen moet</param>
        /// <param name="message">Het bericht</param>
        public static void SendMessage(String username, String message)
        {
            MessageToSend messageToSend = new MessageToSend(username, message);
            lock(MessageQueue)
            {
                MessageQueue.Enqueue(messageToSend);
            }
        }

        /// <summary>
        /// Tijdens het runnen van de manager probeert hij elke 2,5 seconde alle messages uit de queue naar de server te sturen
        /// </summary>
        private static void Run() 
        {
            while (true)
            {
                if (GlobalHelper.IsConnected && MessageQueue.Count > 0)
                {
                    lock (MessageQueue)
                    {
                        for(int i = 0; i < MessageQueue.Count; i++)
                        {
                            MessageToSend messageToSend = MessageQueue.Dequeue();
                            DoSendMessage(messageToSend.Username, messageToSend.Message);
                        }
                    }
                }
                Thread.Sleep(2500);
            }
        }

        /// <summary>
        /// Stuur een bericht naar de server
        /// </summary>
        /// <param name="username">Gebruikersnaam van waar het bericht heen moet</param>
        /// <param name="message">Het bericht</param>
        private static void DoSendMessage(String username, String message)
        {
            HttpGet sendMessageHttpGet = new HttpGet(String.Format(GlobalHelper.Url + "NewChatMessage/{0}/{1}/{2}", UserHelper.Token, username, message), typeof(NewChatMessageResult));
        }

        /// <summary>
        /// Klasse met daarin een bericht dat verstuurd moet worden en zijn bestemming
        /// </summary>
        private class MessageToSend
        {
            public String Username;
            public String Message;

            public MessageToSend(String username, String message)
            {
                this.Username = username;
                this.Message = message;
            }
        }
    }
}
